---
name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    paths:
      - '.github/actions/poetry_setup/action.yml'
      - '.github/workflows/_lint.yml'
      - '.github/workflows/_test.yml'
      - '.github/workflows/langserve_ci.yml'
      - 'langserve/**'
      - 'tests/**'
      - 'examples/**'
      - 'pyproject.toml'
      - 'poetry.lock'
      - 'Makefile'
  workflow_dispatch:  # Allows to trigger the workflow manually in GitHub UI

# If another push to the same PR or branch happens while this workflow is still running,
# cancel the earlier run in favor of the next run.
#
# There's no point in testing an outdated version of the code. GitHub only allows
# a limited number of job runners to be active at the same time, so it's better to cancel
# pointless jobs early so that more useful jobs can run sooner.
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  POETRY_VERSION: "1.5.1"
  WORKDIR: "."

jobs:
  lint:
    uses:
      ./.github/workflows/_lint.yml
    with:
      working-directory: .
    secrets: inherit

  pydantic-compatibility:
    uses:
      ./.github/workflows/_pydantic_compatibility.yml
    with:
      working-directory: .
    secrets: inherit
  test:
    timeout-minutes: 10
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ${{ env.WORKDIR }}
    strategy:
      matrix:
        python-version:
          - "3.8"
          - "3.9"
          - "3.10"
          - "3.11"
    name: Python ${{ matrix.python-version }} tests
    steps:
      - uses: actions/checkout@v3

      - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }}
        uses: "./.github/actions/poetry_setup"
        with:
          python-version: ${{ matrix.python-version }}
          poetry-version: ${{ env.POETRY_VERSION }}
          working-directory: .
          cache-key: langserve-all

      - name: Install dependencies
        shell: bash
        run: |
          echo "Running extended tests, installing dependencies with poetry..."
          poetry install --with test,lint --extras all

      - name: Run tests
        run: make test

      - name: Ensure the tests did not create any additional files
        shell: bash
        run: |
          set -eu

          STATUS="$(git status)"
          echo "$STATUS"

          # grep will exit non-zero if the target message isn't found,
          # and `set -e` above will cause the step to fail.
          echo "$STATUS" | grep 'nothing to commit, working tree clean'
